#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <esp_types.h>
#include <cJSON.h>
#include "protocol_transport.h"

typedef enum
{
    PROTOCOL_ABORT_REASON_NONE = 0,
    PROTOCOL_ABORT_REASON_WAKEUP,
} protocol_abort_reason_t;

/**
 * @brief 文本回调函数
 *
 * @param text 文本
 */
typedef void (*text_callback_t)(char *text);

/**
 * @brief 动作回调函数
 */
typedef void (*action_callback_t)(void);

/**
 * @brief 音频回调函数
 *
 * @param data 音频数据
 * @param len 音频数据长度
 */
typedef void (*audio_callback_t)(void *data, size_t len);

typedef struct protocol protocol_t;

protocol_t *protocol_create(protocol_transport_type_t type);

/**
 * @brief 打开音频通道
 *
 * @param protocol 协议
 * @return true 成功
 * @return false 失败
 */
bool protocol_open_audio_channel(protocol_t *protocol);

/**
 * @brief 关闭音频通道
 *
 * @param protocol 协议
 */
void protocol_close_audio_channel(protocol_t *protocol);

bool protocol_is_audio_channel_open(protocol_t *protocol);

/**
 * @brief 发送音频数据
 *
 * @param data 音频数据
 * @param len 数据长度
 */
void protocol_send_audio(protocol_t *protocol, void *data, size_t len);
/**
 * @brief 建立信道
 *
 */
void protocol_send_hello(protocol_t *protocol);

/**
 * @brief 发送唤醒词
 *
 */
void protocol_send_wake_word(protocol_t *protocol, char *word);

/**
 * @brief 启动和停止监听
 *
 */
void protocol_send_start_listening(protocol_t *protocol);
void protocol_send_stop_listening(protocol_t *protocol);

/**
 * @brief 中断播放
 *
 * @param reason 中断原因
 */
void protocol_abort_speaking(protocol_t *protocol, protocol_abort_reason_t reason);

/**
 * @brief 设置识别回调
 *
 * @param callback 回调函数
 */
void protocol_set_stt_callback(protocol_t *protocol, text_callback_t callback);

/**
 * @brief 设置意图识别回调
 *
 * @param callback
 */
void protocol_set_llm_callback(protocol_t *protocol, text_callback_t callback);

/**
 * @brief 播放开始回调
 *
 * @param callback 回调函数
 */
void protocol_set_tts_start_callback(protocol_t *protocol, action_callback_t callback);

/**
 * @brief 播放结束回调
 *
 * @param callback 回调函数
 */
void protocol_set_tts_stop_callback(protocol_t *protocol, action_callback_t callback);

/**
 * @brief 播放每句话的回调
 *
 * @param callback 回调函数
 */
void protocol_set_tts_sentence_start_callback(protocol_t *protocol, text_callback_t callback);

void protocol_set_iot_callback(protocol_t *protocol, text_callback_t callback);
/**
 * @brief 音频回调
 *
 * @param callback 回调函数
 */
void protocol_set_audio_in_callback(protocol_t *protocol, audio_callback_t callback);

/**
 * @brief 音频通道关闭回调
 *
 * @param callback 回调函数
 */
void protocol_set_audio_channel_close_callback(protocol_t *protocol, action_callback_t callback);

void protocol_send_iot_descriptor(protocol_t *protocol, cJSON *discriptor_json);

void protocol_send_iot_state(protocol_t *protocol, cJSON *state_json);

#endif